import androidx.databinding.ViewDataBinding
import androidx.fragment.app.Fragment
import lib.base.BaseViewModel
import lib.base.IManager

//package lib.base
//
//import android.app.Activity
//import android.content.Intent
//import android.os.Bundle
//import android.text.TextUtils
//import android.view.*
//import androidx.annotation.LayoutRes
//import androidx.annotation.StringRes
//import androidx.databinding.DataBindingUtil
//import androidx.databinding.ViewDataBinding
//import androidx.fragment.app.Fragment
//import androidx.lifecycle.LifecycleCoroutineScope
//import androidx.lifecycle.Observer
//import androidx.lifecycle.ViewModelProvider
//import androidx.lifecycle.coroutineScope
//import com.blankj.utilcode.util.ToastUtils
//import com.blankj.utilcode.util.Utils
//import com.qmuiteam.qmui.widget.QMUITopBarLayout
//import me.lx.mvi.base.BaseViewModel
//import me.lx.mvi.databinding.BaseFragBinding
//import me.lx.mvi.mix.MviLoadingDialog
//import me.lx.mvi.mix.RvBindListener2
//import me.lx.rv.RvBindGroup3Listener
//import me.lx.rv.RvBindGroupListener
//import timber.log.Timber
//import java.lang.reflect.ParameterizedType
//import java.lang.reflect.Type
//
///**
// * @author: luoxiong
// * @date :  2019/4/6
// * @desc ：
// */
//
abstract class BaseFrag<B : ViewDataBinding, VM : BaseViewModel, M : IManager<VM>> : Fragment()
//@Retention(AnnotationRetention.SOURCE)
//annotation class PageStatusNote {
//    companion object {
//        const val def_loading = -1
//        const val dismiss_loading_dialog = 1
//        const val show_page_loading = 2  // Fragment中 HintLayout 布局状态
//        const val show_page_empty = 3
//        const val show_page_error = 4
//        const val hide_status_layout = 5 // 隐藏状态布局
//    }
//}
//
//abstract class BaseFrag<B : ViewDataBinding, VM : BaseViewModel, M : IManager<VM>> : Fragment(),
//    PageStatus {
//    companion object {
//
//        @JvmField
//        var open_print_life_log =  3 == 33
//        var topbarHeight: Int = 0 // 状态布局默认距离顶部的间距, 默认是一个Topbar高度
//        fun <B : Fragment> newSpecInstance(clazz1: Class<out Fragment>, bundle: Bundle? = null): B {
//            val mLoadingDialog = clazz1.newInstance()
//            if (bundle != null) {
//                mLoadingDialog.arguments = bundle
//            }
//            return mLoadingDialog as B
//        }
//
//        fun newInstance(clazz1: Class<out Fragment>, bundle: Bundle? = null): Fragment {
//            val mLoadingDialog = clazz1.newInstance()
//            if (bundle != null) {
//                mLoadingDialog.arguments = bundle
//            }
//            return mLoadingDialog
//        }
//    }
//
//
//    @get:LayoutRes
//    abstract val layoutId: Int
//
//    protected abstract fun doBusiness(savedInstanceState: Bundle?)
//
//    //https://stackoverflow.com/questions/59503689/could-navigation-arch-component-create-a-false-positive-memory-leak/59504797#59504797
//    // 当和Navigation配合使用,Frag执行了onDestroyView(),但是引用还在,成员变量会一直引用根布局,造成内存泄漏
//    private var mBinding: B? = null
//    private var mRootBinding: BaseFragBinding? = null
//    private lateinit var mModel: VM
//    private lateinit var mManager: M
//    protected var isFirstResume = true
//
//    //  private var mLoadingDialog: MviLoadingView? = null
//    private var mLoadingDialog: MviLoadingDialog? = null
//
//    protected var isViewCreated = false
//    public var isDestroyedView = false
//
//    protected open fun initView(savedInstanceState: Bundle?) {}
//
//    override fun onAttach(activity: Activity) {
//        super.onAttach(activity)
//        onAttach()
//        if (open_print_life_log) {
//            Timber.d("当前打开的Frag = ${javaClass.simpleName}" + "   onAttach()....11111111..isAdd=$isAdded")
//        }
//    }
//
//    override fun getHintLayout(): HintLayout? {
//        val layout = mRootBinding?.rootView ?: return null
//        //  layout.setStatusLayoutMarginTop(getStatusLayoutMarginTop())
//        return layout
//    }
//
//    override fun getStatusLayoutMarginTop(): Int {
//        return topbarHeight
//    }
//
//    override fun getStatusLayoutMarginBottom(): Int {
//        return 0
//    }
//
//
//    override fun onCreateView(
//        inflater: LayoutInflater, container: ViewGroup?,
//        savedInstanceState: Bundle?
//    ): View? {
//        isDestroyedView = false
//        mRootBinding = DataBindingUtil.inflate<BaseFragBinding>(inflater, R.layout.base_frag, container, false)
//        if (open_print_life_log) Timber.d(javaClass.simpleName + "  " + "onCreateView()..333....isAdd=$isAdded isVisible=$isVisible")
//        mBinding = DataBindingUtil.inflate(inflater, layoutId, container, false)
//        mBinding!!.lifecycleOwner = this
//        mRootBinding!!.rootView.addView(mBinding!!.root)
//        if (topbarHeight == 0) {
//            topbarHeight = Utils.getApp().resources.getDimension(R.dimen.topbar_height).toInt()
//        }
//        //
//        return mRootBinding!!.root
//    }
//    fun getScope(): LifecycleCoroutineScope? {
//        if (view == null) {
//            // 当view为空, 获取 Scope 会抛异常
//            return null
//        }
//        return viewLifecycleOwner.lifecycle.coroutineScope
//    }
//
//    open fun onAttach() {
//        //fun doAction(action: IAction)
//    }
//
//
//    override fun onResume() {
//        super.onResume()
//        if (isFirstResume) {
//            isFirstResume = false
//            firstOnResume()
//        }
//    }
//
//    open fun onBackPressedSelfDo(): Boolean {
//        return false
//    }
//
//    open protected fun firstOnResume() {
//
//    }
//
////    override fun getResources(): Resources {
////        return AdaptScreenUtils.adaptWidth(super.getResources(), 375)
////    }
//
//    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
//        super.onViewCreated(view, savedInstanceState)
//        if (open_print_life_log) Timber.d(javaClass.simpleName + "  " + "onViewCreated()...444..isAdd=$isAdded  isVisible=$isVisible")
//        val argsType = getActualTypeArguments()
//        initViewModel(argsType)
//        initManager(argsType)
//        // initToolbarClick()
//        setTopbar(null, null)
//        // 必须放在 initSetVariable()上面,因为在initSetVariable()会调用 executePendingBindings(),当布局里需要获取mModel里的属性来判断,
//        // 是否支持加载更多时,这个时候,mModel里的属性还没被初始化,因为初始化是在initView()里的.比如:manager里的supportLoadMore()
//        // 需要根据mModel.intentDto.isShow来判断是否显示加载更多,但是intentDto在initView里才会被初始化
//        initView(savedInstanceState)
//        initSetVariable(getB())
//        registerUIChangeLiveDataCallBack()
//        if (MviConfig.mvi_is_luoxiong) {
//            initViewDebugByLuoxiong()
//        }
//        doBusiness(savedInstanceState)
//        isViewCreated = true
//    }
//
//    open fun initViewDebugByLuoxiong() {
//
//    }
//
//    // 注册dialog 显示和 隐藏的事件
//    open fun registerUIChangeLiveDataCallBack() {
//        mModel.getUC().showDialog.observe(this, Observer<String?> {
//            showLoadingDialog(it)
//        })
////        mModel.getUC().dismissDialog.observe(this, Observer<Void> {
////            dismissLoadingDialog()
////        })
//        mModel.getUC().pageStatusEvent.observe(this, Observer<Int> { pageStatus ->
//            onReceivePageStatusEvent(pageStatus)
//        })
//    }
//
//    fun getM(): M {
//        return mManager
//    }
//
//    fun getVm(): VM {
//        return mModel
//    }
//
//    fun showToast(text: String?) {
//        if (!TextUtils.isEmpty(text)) {
//            ToastUtils.showShort(text)
//        }
//    }
//
//    fun showToast(@StringRes resId: Int) {
//        ToastUtils.showShort(resId)
//    }
//
//    // 接收到页面状态改变
//    private fun onReceivePageStatusEvent(@PageStatusNote pageStatus: Int) {
//        // Timber.d("onReceivePageStatusEvent()..接收页面状态...pageStatus=$pageStatus")
//        when (pageStatus) {
//            PageStatusNote.dismiss_loading_dialog -> {
//                dismissLoadingDialog()
//            }
//            PageStatusNote.show_page_loading -> {
//                showLoading()
//            }
//            PageStatusNote.show_page_empty -> {
//                showEmpty()
//            }
//            PageStatusNote.show_page_error -> {
//                // showError() // 单个接口请求的时候,自己去处理吧 , 因为需要获取点击事件
//            }
//            PageStatusNote.hide_status_layout -> {
//                hideStatusLayout()
//            }
//            else -> {
//
//            }
//        }
//    }
//
//
//    fun dismissLoadingDialog() {
////        Timber.d("关闭对话了..11..cc=${mLoadingDialog != null && mLoadingDialog!!.isShow}")
//        if (mLoadingDialog != null) {
//            mLoadingDialog!!.dismiss()
//        }
//    }
//
//    fun showLoadingDialog(tipWord: String? = null, isCancelable: Boolean = false) {
//        if (mLoadingDialog == null && activity != null) {
////            mLoadingDialog = QMUITipDialog.Builder(requireContext())
////                .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING)
////                .setTipWord(tipWord ?: "正在加载")
////                .create()
//            mLoadingDialog = MviLoadingDialog(requireActivity())
//                //.setTipWord(tipWord ?: "正在加载")
//                .setIsCancelable(MviConfig.mvi_is_luoxiong || isCancelable)
//                .createDialog()
//
//            // 如果用xpopup,在pda设备上,有些对话框无法显示
////            val b = XPopup.Builder(requireContext()).popupType(PopupType.Center)
////                .dismissOnTouchOutside(false)
////                .dismissOnBackPressed(MviConfig.mvi_is_debug)
////                .popupAnimation(PopupAnimation.NoAnimation)
////                .hasShadowBg(false)
////                .asCustom(MviLoadingView(requireContext()))
////            mLoadingDialog = b as MviLoadingView
//        }
//        mLoadingDialog?.setTitle(tipWord ?: "正在加载")
//        mLoadingDialog?.show()
//    }
//
//    open fun isManagerSupportRvAdapter(): Boolean {
//        return false
//    }
//
//    protected fun initViewModel(argsType: Array<out Type>) {
//        var model = createViewModel()
//        val modelClass: Class<VM>
//        if (model == null) {
//            modelClass = argsType[1] as Class<VM>
//            model = ViewModelProvider(this).get(modelClass)
//        }
//        mModel = model
//    }
//
//    private fun initManager(argsType: Array<out Type>) {
//        val type = argsType[2]
//        if (type is Class<*>) {
//            val managerClass = argsType[2] as Class<*>
//            mManager = managerClass.newInstance() as M
//            mManager.setFragment(this)
//                .setActivity(requireActivity())
//                .setViewModel(mModel)
//        } else {
//            mManager = DefaultManager as M
//        }
//        // https://www.jianshu.com/p/862c1a023807
//        //mManager = ReflectUtils.reflect(managerClass).newInstance(this).get()
//    }
//
//    open fun initSetVariable(b: ViewDataBinding) {
//        b.setVariable(BR.vm, mModel)
//        if (mManager is RvBindListener2<*>) {
//            b.setVariable(BR.rvBind, mManager)
//        } else if (mManager is RvBindGroupListener<*, *>) {
//            b.setVariable(BR.rvBindGroup, mManager)
//        } else if (mManager is RvBindGroup3Listener<*, *, *>) {
//            b.setVariable(BR.rvBindGroup3, mManager)
//        }
//        // 在主线程执行,必须要加,因为SwipeRefresh默认在onBusiness()方法里设置refreshingOb为true
//        // 如果不设置该方法立马执行,则不会监听到refreshOb的监听,导致不会请求网络接口
//        b.executePendingBindings()
//
//    }
//
//    private fun getActualTypeArguments(): Array<out Type> {
//        val type = javaClass.genericSuperclass!! as ParameterizedType
//        return type.actualTypeArguments
//    }
//
//    /**
//     * 当Fragment是通过ViewPager适配器创建的,切换当前Fragment时会被回调
//     *
//     *  isMustRefresh 是否强制刷新
//     */
//    open fun onFragmentSelected() {
//
//    }
//
//
//    protected fun finish() {
//        activity?.finish()
//    }
//
//    open fun finishAndSetResultOk(intent: Intent? = null) {
//        activity?.setResult(Activity.RESULT_OK, intent)
//        finish()
//    }
//
//    open fun createViewModel(): VM? {
//        return null
//    }
//
//    /**
//     * 初始化ViewModel
//     *
//     * @return 继承 ViewModel 的ViewModel
//     */
//    open fun getViewModel(): VM {
//        return mModel
//    }
//
//    open fun getManager(): M? {
//        return mManager
//    }
//
//    override fun onCreate(savedInstanceState: Bundle?) {
//        super.onCreate(savedInstanceState)
//        if (open_print_life_log) Timber.d(javaClass.simpleName + "  " + "onCreate()...2222..isAdd=$isAdded isVisible=$isVisible")
//    }
//
//    /**
//     * onStop() 的注释中明确地写了，在内存不足而导致系统无法保留此进程的情况下，onStop() 可能都不会被执行。
//     */
//    override fun onStop() {
//        super.onStop()
//        if (open_print_life_log) Timber.d(javaClass.simpleName + "  " + "onStop().....55555555...isAdd=$isAdded")
//    }
//
//    override fun onDestroyView() {
//        super.onDestroyView()
//        isDestroyedView = true
//        mBinding?.unbind()
//        mRootBinding?.unbind()
//        mBinding = null
//        mRootBinding = null
//        mManager.onDestroy()
//        if (open_print_life_log) Timber.d(javaClass.simpleName + "  " + "onDestroyView().......666666........")
//    }
//
//
//    override fun onDestroy() {
//        super.onDestroy()
//        if (open_print_life_log) Timber.d(javaClass.simpleName + "  " + "onDestroy().......77777777........")
//    }
//
//    override fun onDetach() {
//        super.onDetach()
//        if (open_print_life_log) Timber.d(javaClass.simpleName + "  " + "onDetach().......8888888........")
//    }
//
//    protected fun setTopbarGravityLeft(topbar: QMUITopBarLayout? = null) {
//        topbar ?: getTopbar()?.setTitleGravity(Gravity.START)
//    }
//
//    protected fun setTopbar(title: String?, topbarView: View? = null) {
//        val topbar = topbarView ?: getTopbar()
//        if (topbar is QMUITopBarLayout) {
//            if (title != null) {
//                topbar.setTitle(title)
//            }
//            initToolbarClick(topbar)
//            MviConfig.mviAction.onTopbarCreated(topbar)
//        }
//    }
//
//
//    protected open fun initToolbarClick(topbar: QMUITopBarLayout) {
//        if (topbar.tag != null) return
//        topbar.tag = 1
//        topbar.addLeftBackImageButton().setOnClickListener { clickToolbarBack() }
//    }
//
//    /**
//     * 点击toolBar的返回
//     */
//    protected open fun clickToolbarBack() {
//        activity?.onBackPressed()
//    }
//
//    open fun getTopbar(): QMUITopBarLayout? {
//        return (mBinding?.root as? ViewGroup)?.getChildAt(0) as? QMUITopBarLayout
//    }
//
//    open fun getB(): B {
//        return mBinding!!
//    }
//
//    fun getBNull(): B? {
//        return mBinding
//    }
//
//    fun isViewCreatedAndNoDestroy(): Boolean {
//        return !isDestroyedView && isViewCreated
//    }
//
//    open fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
//        return false
//    }
//
//    fun setDialogLoadingTitle(s: String) {
//        mLoadingDialog?.setTitle(s)
//    }
//}
